package 动态规划;

public class No152乘积最大子数组 {

    /**
     * 给你一个整数数组 nums ，请你找出数组中乘积最大的连续子数组（该子数组中至少包含一个数字），
     * 并返回该子数组所对应的乘积。
     *
     * 示例 1:
     * 输入: [2,3,-2,4]
     * 输出: 6
     * 解释: 子数组 [2,3] 有最大乘积 6。
     * 示例 2:
     * 输入: [-2,0,-1]
     * 输出: 0
     * 解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
     */

    /**
     * 动态规划求解,找出最小长度数组的最大连续数组
     * 假设[2,3,-2,4]
     * f(1)=max(0*2,f(0)*3);
     * f(2)=max(2*3,f(1)*3);
     * f(3)=max(3*-2,f(2)*-2);
     */
    public int maxProduct(int[] nums) {

        /**
         * 1.[1,-2,3,-4] 其中-2,3,-4也是正数子串,所以要维护两个dp,一个最大一个最小,两者相互取
         */
        int[] dpMax=new int[nums.length];
        int[] dpMin=new int[nums.length];
        dpMin[0]=dpMax[0]=nums[0];

        for (int i = 1; i < nums.length; i++) {
            //最小的为什么要和最大的相乘呢?因为考虑负数的情况
            dpMax[i]=Math.max(dpMin[i-1]*nums[i],Math.max(dpMax[i-1]*nums[i],nums[i]));
            dpMin[i]=Math.min(dpMax[i-1]*nums[i],Math.min(dpMin[i-1]*nums[i],nums[i]));
        }

        int res=dpMax[0];
        for (int max : dpMax) {
            res = Math.max(res, max);
        }

        return res;
    }

    public static void main(String[] args) {
        No152乘积最大子数组 n=new No152乘积最大子数组();
        int[] arr={-2};
        int result = n.maxProduct(arr);
        System.out.println(result);
    }

}
